# from channels.generic.websocket import WebsocketConsumer
# from channels.exceptions import StopConsumer
#
# from asgiref.sync import async_to_sync
# from channels.layers import get_channel_layer
#
# import json
#
#
# class ChatConsumer(WebsocketConsumer):  # 继承WebsocketConsumer
#     #    room_name = 'chat_all_data'
#     def __init__(self, *args, **kwargs):
#         super().__init__(args, kwargs)
#         self.group_name = None
#
#     def websocket_connect(self, message):
#         print("有人进行连接了。。。。")
#         self.group_name = self.scope['url_route']['kwargs']['group']
#         async_to_sync(self.channel_layer.group_add)(str(self.group_name), self.channel_name)
#
#         # 有客户端向后端发送 WebSocket 连接的请求时，自动触发(握手)
#         self.accept()
#
#     def websocket_receive(self, message):
#         # 浏览器基于 WebSocket 向后端发送数据，自动触发接收消息
#         # 消息持久化 mysql  redis
#         print(message['text'])
#
#     def websocket_disconnect(self, message):
#         # 客户端向服务端断开连接时，自动触发
#         print("连接断开！！")
#         self.group_name = self.scope['url_route']['kwargs']['group']
#
#         async_to_sync(self.channel_layer.group_discard)(
#             self.group_name,
#             self.channel_name
#         )
#         raise StopConsumer()
#
#     # 自定义的处理房间组内的数据
#     def send_to_chrome(self, event):
#         try:
#             data = event.get('data')
#             # 接收房间组广播数据，将数据发送给websocket
#             self.send(json.dumps(data, ensure_ascii=False))
#         except Exception as e:
#             pass

"""
    1. 获取参数
    2. 判断用户还是司机
    3. 如果是用户 用userid+driver建立房号，并且把当前用户发送到司机的房间号
    4. 如果是司机，用driver建立房间号
    5. 有客户端向后端发送 WebSocket 连接的请求时，自动触发(握手)
    6. 客户端向后端发送数据时，自动触发
    7. 客户端向服务端断开连接时，自动触发
    8. 自定义的处理房间组内的数据
"""
from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumer

from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer

import json


# 定义一个处理字符串的函数，用于查找并截取字符串
def process_string(input_string, userstr):
    """
    在输入字符串中查找用户字符串，并返回其后的子字符串。

    :param input_string: 原始字符串
    :param userstr: 要查找的用户字符串
    :return: 查找到的字符串之后的子字符串，如果未找到则返回None
    """
    index = input_string.find(userstr)
    if index != -1:
        return input_string[index + len(userstr):]
    else:
        return None

# 初始化一个列表，用于存储聊天记录或用户信息
list = []


# 定义一个WebSocket消费者类，继承自WebsocketConsumer
class ChatConsumer(WebsocketConsumer):  # 继承WebsocketConsumer
    # 初始化类实例时，设置group_name为None
    def __init__(self, *args, **kwargs):
        super().__init__(args, kwargs)
        self.group_name = None

    # 处理WebSocket连接
    def websocket_connect(self, message):
        """
        当有客户端连接时自动触发。

        :param message: 连接消息
        """
        print("有人进行连接了。。。。")
        driver = 1001
        # 获取URL参数中的group值
        self.group_name = self.scope['url_route']['kwargs']['group']
        # 判断是用户还是司机
        if self.group_name.find("user") >= 0:
            # 如果是用户，创建房间号并发送用户信息到司机
            room = self.group_name + str(driver)
            async_to_sync(self.channel_layer.group_add)(room, self.channel_name)
            channel_layer = get_channel_layer()
            async_to_sync(channel_layer.group_send)(
                str(driver),  # 房间组名
                {
                    'type': 'send_to_chrome',  # 消费者中处理的函数
                    'data': {"id": self.group_name, "name": "用户" + str(self.group_name)}
                }
            )
            print(room + "用户房间号")
        else:
            # 如果是司机，直接创建房间号
            async_to_sync(self.channel_layer.group_add)(str(driver), self.channel_name)
            print(str(driver) + "司机房间号")
        # 接受WebSocket连接
        self.accept()

    # 处理WebSocket接收的消息
    def websocket_receive(self, message):
        """
        当收到客户端消息时自动触发。

        :param message: 接收到的消息
        """
        driver = 1001
        # 解析接收到的JSON消息
        mess = json.loads(message['text'])
        userid = mess['to']
        room = str(userid) + str(driver)
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.group_send)(
            room,  # 房间组名
            {
                'type': 'send_to_chrome',  # 消费者中处理的函数
                'data': {"mes": mess['mes']}
            }
        )
        print(room)
        print(mess)

    # 处理WebSocket断开连接
    def websocket_disconnect(self, message):
        """
        当客户端断开连接时自动触发。

        :param message: 断开连接的消息
        """
        print("连接断开！！")
        self.group_name = self.scope['url_route']['kwargs']['group']
        # 从房间组中移除当前消费者
        async_to_sync(self.channel_layer.group_discard)(
            self.group_name,
            self.channel_name
        )
        # 停止消费者
        raise StopConsumer()

    # 自定义处理房间组内的数据
    def send_to_chrome(self, event):
        """
        处理发送到Chrome的消息。

        :param event: 事件数据
        """
        try:
            data = event.get('data')
            # 将数据发送到WebSocket
            self.send(json.dumps(data, ensure_ascii=False))
        except Exception as e:
            pass
